package com.modular.iot.opt;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.c.opt.ComOpt;
import com.modular.iot.bean.ThingsDeviceConfigDo;
import ntd.util.ToolLock;

import java.util.concurrent.atomic.AtomicReference;

public class OptIotDeviceConfig extends ComOpt<ThingsDeviceConfigDo> {

    public OptIotDeviceConfig() {
        super("things_device_config");
    }

    /**
     * 初始化并获取设备最新配置信息
     * @param code
     * @return
     */
    public ThingsDeviceConfigDo init(String code) {
        AtomicReference<ThingsDeviceConfigDo> thingsDeviceConfigDoRes = new AtomicReference<>();
        ToolLock.lockRun("iot-device-config-init-" + code, () -> {
            ThingsDeviceConfigDo thingsDeviceConfigDo = query().eq("code", code).getBean();
            if (ObjectUtil.isNull(thingsDeviceConfigDo)) {
                // 如果不存在自动进行初始化
                thingsDeviceConfigDo = new ThingsDeviceConfigDo();
                thingsDeviceConfigDo.setCode(code);
                thingsDeviceConfigDo.setConfig(JSONUtil.createObj().toString());
                thingsDeviceConfigDo.setId(syncBean(thingsDeviceConfigDo));
            }
            thingsDeviceConfigDoRes.set(thingsDeviceConfigDo);
        });
        return thingsDeviceConfigDoRes.get();
    }

    /**
     * 更新设备配置信息 - 某个模块
     * @param code
     * @param block
     * @param inConfig
     */
    public void updateByBlock(String code, String block, String inConfig) {
        JSONObject config = getConfig(code);
        config.putOpt(block, inConfig);
        // 更新数据
        ThingsDeviceConfigDo thingsDeviceConfigDo = init(code);
        thingsDeviceConfigDo.setFlag(false);
        thingsDeviceConfigDo.setConfig(config.toString());
        syncBean(thingsDeviceConfigDo);
    }

    /**
     * 更新公共配置
     * @param code
     * @param inConfig
     */
    public void updateComConfig(String code, String inConfig) {
        updateByBlock(code, "com-config", inConfig);
    }

    /**
     * 获取公共配置信息
     * @param code
     * @return
     */
    public String getComConfig(String code) {
        return getConfig(code).getStr("com-config");
    }

    /**
     * 根据code获取配置信息
     * @param code
     * @return
     */
    public JSONObject getConfig(String code) {
        ThingsDeviceConfigDo thingsDeviceConfigDo = init(code);

        // 处理原始数据不对的特殊情况
        if (!JSONUtil.isTypeJSONObject(thingsDeviceConfigDo.getConfig())) {
            thingsDeviceConfigDo.setConfig(JSONUtil.createObj().toString());
        }

        // 当前配置信息
        return JSONUtil.parseObj(thingsDeviceConfigDo.getConfig());
    }


}
